// Copyright  2012 Petr TALLA. [petr.talla@gmail.com]
// This file is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License
// as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This file is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY;  without even the implied warranty
// of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU Lesser General Public License for more details.
// [http://www.gnu.org/copyleft/lesser.html]
//=============================================================================
#pragma once

#include <map>
#include <list>
#include <string>

class TcObject;
class TcView;

//=============================================================================
class TcObjectRegistry {
//=============================================================================
public:
//<NEIGHBOURS>
    static TcObjectRegistry& registry(void);
//<METHODS>
    TcObject* find(int id);
    template <class T> T* findt(int id)
    {   return dynamic_cast<T*>(find(id));
    }

    TcObject* find(const char* name);
    template <class T> T* findt(const char* name)
    {   return dynamic_cast<T*>(find(name));
    }

//=============================================================================
protected:
//<DATA>
    int                             maxid_;
    std::map<int,TcObject*>         objects_;
    std::map<std::string,TcObject*> named_;
    std::list<TcObject*>            outdated_;
    int                             lock_;
    std::list<TcView*>              views_;
 //<INTERNALS>
    void lockDecrement_();
 //<HIDDING>
    TcObjectRegistry();
 //<FRIENDS>
    friend class TcObject;
    friend class TcLock;
    friend class TcView;
};
